/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package espe.ccsoft.controllers;

import espe.ccsoft.controllers.utils.JsfUtil;
import espe.ccsoft.controllers.utils.MD5Encrypt;
import espe.ccsoft.controllers.utils.PaginationHelper;
import espe.ccsoft.controllers.utils.ValidacionException;
import espe.ccsoft.dao.UsuarioDao;
import espe.ccsoft.models.Usuario;
import java.sql.SQLException;
import java.util.Objects;
import java.util.ResourceBundle;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.servlet.http.HttpSession;

@ManagedBean
@RequestScoped
public class UsuarioController {
    
    private Usuario usuario;
    private DataModel items = null;
    private PaginationHelper pagination;
    private int selectedItemIndex = 0;
    private UsuarioDao usuariodao;
    private final MD5Encrypt _encriptar = new MD5Encrypt();
    
    public Usuario getSelected() {
        if (usuario == null) {
            usuario = new Usuario();
            selectedItemIndex = -1;
        }
        return usuario;
    }
    
    public UsuarioDao getUsuarioDao() {
        usuariodao = new UsuarioDao();
        return usuariodao;
    }
    
    public PaginationHelper getPagination() {
        if (pagination == null) {
            pagination = new PaginationHelper(10) {
                
                @Override
                public int getItemsCount() {
                    try {
                        return getUsuarioDao().findAll().size();
                    } catch (Exception ex) {
                        return 0;
                    }
                }
                
                @Override
                public DataModel createPageDataModel() {
                    try {
                        return new ListDataModel(getUsuarioDao().findAll());
                    } catch (Exception ex) {
                        return new ListDataModel();
                    }
                }
            };
        }
        return pagination;
    }
    
    public final String cargarCrearUsuario() {
        usuario = new Usuario();
        return "Crear";
    }
    
    public final String crearUsuario() throws SQLException, Exception {
        UsuarioDao dao = new UsuarioDao();
        Usuario usuarioTmp = dao.findByCorreo(usuario.getCorreo());
        try {
            if (usuarioTmp == null) {
                usuario.setContrasena(_encriptar.EncryptText(usuario.getContrasena()));
                dao.insert(usuario);
                JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/UsuarioLabels").getString("CrearUsuario"));
                return "Index";
            } else {
                throw new ValidacionException("El usuario ya se encuentra registrado");
            }
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/UsuarioLabels").getString("ValidarCrearUsuario"));
            return null;
        }
    }
    
    public final String getNombreUsuario() throws Exception{
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        int id_usuario = (Integer) session.getAttribute("Id_usuario");
        UsuarioDao dao = new UsuarioDao();
        Usuario usuarioTmp = dao.findByPK(id_usuario);
        
        return usuarioTmp==null?"":usuarioTmp.getNombres()+" "+usuarioTmp.getApellidos();
    }
    
    public final boolean getNuevoUsuario() throws Exception{
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        int id_usuario = (Integer) session.getAttribute("Id_usuario");
        UsuarioDao dao = new UsuarioDao();
        Usuario usuarioTmp = dao.findByPK(id_usuario);
        
        return usuarioTmp==null?false:usuarioTmp.isNuevo();
    }
    
    public final String cambiarContrasena() throws Exception {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        int id_usuario = (Integer) session.getAttribute("Id_usuario");
        UsuarioDao dao = new UsuarioDao();
        Usuario usuarioTmp = dao.findByPK(id_usuario);
        
        try {
            if (usuarioTmp != null) {
                if ((usuarioTmp.getContrasena())
                        .equals(usuario.getContrasena())) {
                    usuario.setContrasena(_encriptar.EncryptText(usuario.getNuevacontrasena()));
                    usuario.setNuevo(false);
                    usuario.setId(id_usuario);
                    dao.updatePassword(usuario);
                    selectedItemIndex = 1;
                    JsfUtil.addSuccessMessage("Se realizó el cambio correctamente, por favor inicie sesión nuevamente");
                    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
                    return "/LogIn.xhtml?faces-redirect=true";
                } else {
                    JsfUtil.addErrorMessage("La antigua contraseña no es la correcta");
                    return null;
                }
            } else {
                JsfUtil.addErrorMessage("No existe el usuario");
                return null;
            }
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, "Error");
            return null;
        }
    }
    
    public final String cargarEditarUsuario() {
        usuario = (Usuario) getItems().getRowData();
        usuario.setContrasena(_encriptar.DecryptText(usuario.getContrasena()));
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "Modificar";
    }
    
    public final String editarUsuario() throws Exception {
        
        try {
            if (validarEntradasUsuario(usuario)) {
                usuario.setContrasena(_encriptar.EncryptText(usuario.getContrasena()));
                getUsuarioDao().update(usuario);
                JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/UsuarioLabels").getString("EditarUsuario"));
                return "Index";
            } else {
                JsfUtil.addErrorMessage(ResourceBundle.getBundle("/UsuarioLabels").getString("ValidarNombreUsuario"));
                return null;
            }
        } catch (Exception e) {
            return "/Error";
        }
    }
    
    public final boolean validarEntradasUsuario(Usuario usuario) throws Exception {
        
        Usuario usuarioTmp = getUsuarioDao().findByNombre(usuario.getNombres(),
                usuario.getApellidos(), usuario.getCedula(), usuario.getCorreo());
        
        if (usuarioTmp != null) {
            if (Objects.equals(usuarioTmp.getId(), usuario.getId())) {
                usuario.setFecha_creacion(usuarioTmp.getFecha_creacion());
                return true;
            }
            return false;
        } else {
            usuario.setFecha_creacion(getUsuarioDao().findByPK(usuario.getId()).getFecha_creacion());
            return true;
        }
        
    }
    
    public final String cargarEditarDetalleUsuario(int id_usuario) throws Exception {
        usuario = getUsuarioDao().findByPK(id_usuario);
        usuario.setContrasena(_encriptar.DecryptText(usuario.getContrasena()));
        return "Modificar";
    }
    
    public final String cargarDetalleEditarUsuario(int id_usuario) throws Exception {
        usuario = getUsuarioDao().findByPK(id_usuario);
        return "Detalle";
    }
    
    public DataModel getItems() {
        if (items == null) {
            items = getPagination().createPageDataModel();
        }
        return items;
    }
    
    public int getSelectedItemIndex() {
        return selectedItemIndex;
    }
    
    public void setSelectedItemIndex(int selectedItemIndex) {
        this.selectedItemIndex = selectedItemIndex;
    }
    
}
